import java.lang.*;
import java.util.*;
import java.io.*;
import java.sql.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.smtp.*;
import javax.servlet.*;
import dbBean.DBConnectionManager;


public class Mail implements Runnable
{
  DBConnectionManager connMgr;
  ServletContext sc;

  public Mail(DBConnectionManager db, ServletContext servletContext) {
	connMgr=db;
	sc=servletContext;
  }

  public void run() {
    String texto="", line=null, user, telefono=null, email;
    String[] tokens;

    Properties sysProperties = System.getProperties();
    Session session = Session.getDefaultInstance(sysProperties, null);
    session.setDebug(false);

    while(true) {
      try {
	try {
	  Thread.sleep(5000);
	} catch(InterruptedException e) {}

	sc.log("- Conectamos con el servidor POP3");
        Store store = session.getStore("pop3");
        store.connect("127.0.0.1", -1, "GPSOU@ya.com", "********");
        

        Folder folder = store.getDefaultFolder();
        if (folder == null)
            throw new NullPointerException("No default mail folder");

        folder = folder.getFolder("INBOX");
        if (folder == null)
            throw new NullPointerException("Unable to get folder: " + folder);

        folder.open(Folder.READ_WRITE);
        int totalMessages = folder.getMessageCount();
        if (totalMessages == 0)
        {
	    sc.log("- No hay mensajes nuevos");
            folder.close(false);
            store.close();
            continue;
        }
        
        // Get attributes & flags for all messages
        //
        Message[] messages = folder.getMessages();
        FetchProfile fp = new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        fp.add(FetchProfile.Item.FLAGS);
        fp.add("X-Mailer");
        folder.fetch(messages, fp);

        // Process each message
        //
	sc.log("- Hay "+messages.length+" mensajes de correo nuevos");
        for (int i = 0; i < messages.length; i++)
        {
	    telefono=null;
            if (!messages[i].isSet(Flags.Flag.SEEN) && messages[i].isMimeType("text/*")) {
	      try {
		sc.log("- Procesando un mensaje");
	        String subject=messages[i].getSubject();
		Address a[]=messages[i].getFrom();
		String from=a[0].toString();
		String content=(String)messages[i].getContent();

    		BufferedReader br=new BufferedReader(new StringReader(content));
    		line=br.readLine();
		if(line.startsWith("Movil:")) {
	  	  	int j=line.indexOf(':');
	  	  	telefono=line.substring(j+1).trim();
		}

    		while((line=br.readLine())!=null)
			texto+=line+"\n";
		if(texto.startsWith("Texto:")) {
			int j=texto.indexOf(':');
			texto=texto.substring(j+1).trim();
		}
    		br.close();

		sc.log("Recibido: #"+texto+"# desde el numero: "+telefono);
	      } catch (IOException e) {
		sc.log("Mail: ", e);
	      }



  	      tokens=texto.split(" +");

  	      if((tokens[0].compareToIgnoreCase("ALTA")==0) &&(tokens.length>1)) {
    			Connection conn=null;
    			try {
				user=tokens[1].trim();

				sc.log("Activamos la cuenta del usuario "+user+" en la BBDD");
				conn=connMgr.getConnection("mysql");
        			PreparedStatement pstmt=conn.prepareStatement("SELECT telefono, email FROM usuarios WHERE user=?;");
				pstmt.setString(1, user);
				ResultSet rs=pstmt.executeQuery();
				if(rs.next()) {
	  			  if(rs.getString(1)==null) {
				    email=rs.getString(2);
	    			    pstmt.close();
            			    pstmt=conn.prepareStatement("UPDATE usuarios SET telefono=? WHERE user=?;");
	    			    pstmt.setString(1, telefono);
	    			    pstmt.setString(2, user);
	    			    pstmt.executeUpdate();

				    EnviaConfirmacion(user, email);
          			  }
  				}
				rs.close();
				pstmt.close();
				sc.log("Se ha activado la cuenta correctamente");
    			} catch(SQLException e) {
				e.printStackTrace();
    			}

    			if(conn!=null)
        			connMgr.freeConnection("mysql",conn);
  	      }
            }
            messages[i].setFlag(Flags.Flag.DELETED, true); 
        
        }
        folder.close(true);
        store.close();
        sc.log("- Se ha cerrado la conexión con el servidor POP3");
      } catch(MessagingException e) {
	sc.log("Mail: ", e);
      }
    }
  }

  void EnviaConfirmacion(String user, String email) {
	String mailhost="127.0.0.1";
	try {
                Properties props=System.getProperties();
                props.put("mail.smtp.host", mailhost);
                props.put("mail.smtp.auth", false);

                Session session=Session.getInstance(props, null);

                Message msg=new MimeMessage(session);
                msg.setFrom(new InternetAddress("localizador@pdiazr.es"));
                msg.setRecipient(Message.RecipientType.TO, new InternetAddress(email));
                msg.setSubject("Localizador GPS");

		String texto="<html>\n";
		texto+="<body>\n";
		texto+="<h1>Localizador GPS</h1>\n";
		texto+="<hr>\n";
		texto+="<br/>\n";
		texto+="<br/>\n";
		texto+="Tu registro ha sido confirmado con &eacute;xito.<br/><br/>";
		texto+="Ya puedes comenzar a crear tus propias rutas, dejar que tus amigos vean donde te encuentras cuando lo desees y reproducir los recorridos realizados sobre los mapas de GoogleMaps, sobre la aplicaci&oacute;n Google Earth o sobre mapas de OziExplorer.<br/><br/>";
		texto+="Esperamos que lo disfrutes.<br/><br/>";
		texto+="<a href=\"http://www.pdiazr.es\">http://www.pdiazr.es</a><br/>";
		texto+="Tu nombre de usuario: "+user+"<br/>";
		texto+="Si has olvidado tu clave solicita una nueva aqu&iacute;: <a href=\"http://www.pdiazr.es/GoogleGPS/html/RecuperarClave.html\">Recuperar Clave</a>.";
		
		texto+="</body>\n";
		texto+="</html>";
                msg.setContent(texto, "text/html");

                msg.setHeader("X-Mailer", "smtpsend");
                msg.setSentDate(new java.util.Date());

                SMTPTransport t=(SMTPTransport)session.getTransport("smtp");
                t.connect(mailhost, null, null);
                t.sendMessage(msg, msg.getAllRecipients());

                t.close();
	} catch(MessagingException e) {
		sc.log("ERROR: fallo al enviar correo electronico");
	}
  }
}
